QuickSight と EC2(MySQL) を接続してみた

QuickSight と EC2(MySQL) を接続してみた

Clock Icon2024.12.06

こんにちは、すながわです。
業務で QuickSight に触れる機会がありましたため、QuickSight-EC2(MySQL) 接続を記録に残します。具体的には以下のような構成を作ります。

QStoEC2.drawio

EC2 作成

以下構成で作成しました。

  • AmazonLinux 2023
  • パブリック IP あり
  • パブリックサブネットへ配置

パブリックサブネットへ配置した理由は、ローカルから ssh で直接ログインするためです。一方、プライベートサブネットに EC2 を配置しても今回の QuickSight からの接続は同様に行えると思いますので、任意に設定ください。

EC2 に MySQL をインストール

EC2 に MySQL をインストール、ログインする手順は以下ブログをご参照ください。
https://dev.classmethod.jp/articles/Install-mysql-on-al2023-and-login/

ログインできたら QuickSight から MySQL へ接続するための専用のユーザーを作成しておきます。

mysql> CREATE USER 'sample_user_for_qs' IDENTIFIED BY 'Pass!123';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'sample_user_for_qs'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> select user, host from mysql.user;
+--------------------+-----------+
| user               | host      |
+--------------------+-----------+
| sample_user_for_qs | %         |
| mysql.infoschema   | localhost |
| mysql.session      | localhost |
| mysql.sys          | localhost |
| root               | localhost |
+--------------------+-----------+
5 rows in set (0.00 sec)

ちなみに上記のユーザーは、新規作成せずに既にある root などを使っても構いません。一方で、root のデフォルトでは、mysql.user テーブルの "host" が上記のように "localhost" のみとなっており、外部からこのユーザーで接続することができない(接続しようとすると Host xxx is not allowed to connect to this MySQL server エラーとなる)ので、適宜権限を修正してください。今回はわかりやすく、上記のようにユーザーを新規作成するやり方にしました。

また、後ほど QuickSight から EC2 内の MySQL データベースへ接続するため、任意のデータベースおよびテーブルも作成しておきます。

mysql> CREATE DATABASE blog_db;
Query OK, 1 row affected (0.01 sec)

mysql> USE blog_db;
Database changed

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| blog_db    |
+------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE user (id int, name varchar(10));
Query OK, 0 rows affected (0.03 sec)

mysql> SHOW tables;
+-------------------+
| Tables_in_blog_db |
+-------------------+
| user              |
+-------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO user values (1, 'Taro');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO user values (2, 'Hanako');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO user values (3, 'Jiro');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+------+--------+
| id   | name   |
+------+--------+
|    1 | Taro   |
|    2 | Hanako |
|    3 | Jiro   |
+------+--------+
3 rows in set (0.00 sec)

QuickSight ENI 用のセキュリティグループの作成

QuickSight 用のセキュリティグループを作成し、
以下のように EC2 のセキュリティグループからの全ての TCP を許可するインバウンドルールを設定します。

  • タイプ:すべてのTCP
  • プロトコル:TCP
  • ポート範囲:0-65535
  • ソース:EC2のセキュリティグループ

スクリーンショット 2024-12-05 21.20.49

上記のようにインバウンドルールを追加する理由は、QuickSight 用の ENI にアタッチされたセキュリティグループの通信はステートフルじゃないためです。このような設定を入れないと、QuickSight から EC2 への行きの通信はできても帰りの通信で弾かれてしまうため、結果として通信がうまくいきません。
詳細は以下ブログをご参照ください。
https://aws.amazon.com/jp/blogs/news/amazon-quicksight-private-vpc-access/

EC2(MySQL)のセキュリティグループの設定

EC2 のセキュリティグループには以下のように QuickSight ENI にアタッチされたセキュリティグループからの通信を許可します。ssh 用のルールもありますが、これはローカルから EC2 にアクセスするためのものです。

スクリーンショット 2024-12-05 21.50.21

QuickSight 実行ロールの作成

以下の設定でロールを作成します。詳細は公式ドキュメントをご参照ください。
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/vpc-creating-a-connection-in-quicksight-console.html

カスタム信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "quicksight.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

許可ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:ModifyNetworkInterfaceAttribute",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeSubnets",
                "ec2:DescribeSecurityGroups"
            ],
            "Resource": "*"
        }
    ]
}

QuickSight アカウント設定メニューからVPC接続定義を作成

QuickSight ホーム画面 → 右上プロフィールアイコン → QuickSight を管理 → VPC 接続の管理 → VPC接続の追加 の順に選択します。その後以下のように設定し、画像下側の "追加" ボタンを選択。

  • VPC接続名:<任意の名前>
  • VPC ID:EC2 が所属する VPC
  • 実行ロール:前述の実行ロールを指定
  • サブネット:1a と 1c のプライベートサブネットを指定
  • セキュリティグループID:前述で作成済みの QuickSight アクセス用のセキュリティグループ ID

スクリーンショット 2024-12-05 22.00.55

VPC 接続が作成されます。以下のようにステータスが AVAILABLE になればOKです。
スクリーンショット 2024-12-05 22.02.43

データセットの作成

右上の "新しいデータセット" を選択します。
image (4)

データセットの中から「MySQL」を選択します。
image5

データソースの設定は以下のようにします。ポイントはデータベースサーバーとして EC2 のプライベート IP を指定する部分です。

  • データソース名:<任意の名前>
  • 接続タイプ:先ほど作成した VPC 接続を選択
  • データベースサーバー:<EC2 のプライベート IP>
  • ポート:3306
  • データベース名:前述の項で作成したデータベース名
  • ユーザー名:前述した QuickSight 接続用に作成したユーザー名
  • パスワード:MySQL ログイン時のパスワード
  • SSL の有効化:チェックを外す

完成形が以下画像です。画像左下のボタンは "接続を検証" するボタンなので、ボタンを押下して以下画像のように "検証済み" と表示されることを確認してください。確認できたら、右下の "データソースを作成" を選択します。
スクリーンショット 2024-12-06 8.38.00

以下の画面になるので、事前作成しておいた MySQL のテーブル user を選択し、右下の「選択」を実行します。
image (4)

SPICEへインポートを選択し、"Visualize" を選択します。
image (5)

以下画面となるので、「インタラクティブシート」を選択した状態で「作成」をクリックします。
image (6)

あとは、ダッシュボードができるので、適当なビジュアルで mysql のデータを可視化しましょう。これで MySQL on EC2 を QuickSight に繋げることができました。
image (7)

終わりに

今回は QuickSight と EC2(MySQL) を繋げる部分を実施してみました。
やってみると QuickSight 用のセキュリティグループの設定や ENI を 2つ以上設定する必要があることなど、普段知らないことが知れたのでとても有意義でした。また、MySQL のユーザーの "localhost" の部分は原因がわからず苦労しました。
本記事がどなたかのお役に立てば幸いです。

参考文献

https://dev.classmethod.jp/articles/Install-mysql-on-al2023-and-login/
https://aws.amazon.com/jp/blogs/news/amazon-quicksight-private-vpc-access/
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/vpc-qeni.html
https://dev.classmethod.jp/articles/quicksight-new-vpc-multi-az/
https://dev.classmethod.jp/articles/amazon-quicksight-redshift-serverless-vpc-connection/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.